package metar;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * Beobachtungszeitpunkt
 * @author Michel Metzger, Java-Kurs 2013
 * @version 1.0.0
 *
 */
public class ObservationDateMetar implements MetarParamInterface {

	/**
	 * Beobachtungszeitpunkt
	 */
	private Date date;

	/**
	 * Originalwert aus der Metar-info
	 */
	private String origParam;

	/**
	 * Konstruktor
	 */
	public ObservationDateMetar() {
		date = new Date();
	}

	/**
	 * Liefert den Beobachtungszeitpunkt 
	 * @return
	 */
	public Date getDate() {
		return date;
	}

	/**
	 * Liefert den original Parameter aus dem MetarInfo
	 * @return
	 */
	public String getOrigParam() {
		return origParam;
	}

	/**
	 * Liefert true, wenn der angegebene Parameter einen Beobachtungszeitpunkt enthält
	 * @param val
	 * @return
	 */
	public static boolean isValid(String val) {
		if (val == null) {
			return false;
		}
		if (val.matches("\\d{6}Z")) {
			return true;
		}
		return false;
	}

	/**
	 * Beobachtungszeitpunkt aus dem Parameter aufbereiten
	 * @return
	 * @throws MetarParseException
	 */
	@Override
	public ObservationDateMetar parseParam(String val) throws MetarParseException {
		if (!isValid(val)) {
			throw new MetarParseException("Exception while parsing observationdate!");
		}

		/**
		 * Sample:
		 * 081620Z = Beobachtungszeitpunkt (08. des Monats, um 16:20 UTC also 17:20 MEZ bzw. 18:20 MESZ)
		 */

		try {
			origParam = val;

			int day = Integer.valueOf(val.substring(0, 2));
			int hour = Integer.valueOf(val.substring(2, 4));
			int minute = Integer.valueOf(val.substring(4, 6));
			
			if (MetarInfo.isDebugMode()) {
				System.out.println("day=" + day);
				System.out.println("hour=" + hour);
				System.out.println("minute=" + minute);
			}
			
			Calendar cal = Calendar.getInstance();
			cal.set(Calendar.DAY_OF_MONTH, day);
			cal.set(Calendar.HOUR_OF_DAY, hour);
			cal.set(Calendar.MINUTE, minute);
			cal.set(Calendar.SECOND, 0);
			cal.set(Calendar.MILLISECOND, 0);
			
			date = cal.getTime();
			
			if (MetarInfo.isDebugMode()) {
				DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy  HH:mm:ss");
				System.out.println("*** ObservationDate.date=" + dateFormat.format(date));
			}
			
		} catch (NumberFormatException e) {
			if (MetarInfo.isDebugMode()) {
				e.printStackTrace();
			}
			throw new MetarParseException("Exception while parsing ObservationDate!", e);
		}
		
		return this;
	}
}
